#include "std_weak_ptr.h"

int std_weak_ptr() {
    //! 1. 基本使用
    std::shared_ptr<int> sp(new int(10));             //  创建shared_ptr
    std::weak_ptr<int>   wp(sp);

    std::cout << wp.use_count() << std::endl;         // 1

    // 判断原始shared_ptr是否已经作废(释放, 过期)
    if (wp.expired()) {
        std::cout << "expired" << std::endl;
    } else {
        std::cout << "not expired" << std::endl;
        auto spt = wp.lock();                          //   通过lock方法获取原始智能指针
        std::cout << spt.use_count() << std::endl;     //    2
        std::cout << *spt << std::endl;                //    10
    }

    //! 2. 返回this指针
    // shared_ptr不能返回this是因为this是裸指针, 可能导致重复析构
    // weak_ptr不增加引用计数，自己也不释放原始指针, 所以更安全


    //! 4. 解决循环引用问题
    std::shared_ptr<A> ap(new A);
    std::shared_ptr<B> bp(new B);
    ap->bptr = bp;
    bp->aptr = ap;

    return 0;
}